/*=============================================================================

  AREA UTILITY MODULE

  FILE: area_ptask.cpp
  
  DESCRIPTION

    TMIP UTILITY MODULE
    
  EXTERNALIZED FUNCTIONS

    
  Copyright (c) DaeSung Engineering Inc. All rights reserved.

=============================================================================*/
/*=============================================================================

                             EDIT HISTORY

  ---------  -------  -------------------------------------------------------
    when       who     what, where, why
  ---------  -------  -------------------------------------------------------
   05/26/05   pkim    Version E01.0

=============================================================================*/

/*=============================================================================
  HEADER INCLUSION
=============================================================================*/
#include <area_mod.h>
#include <Vmanual.h>

/*=============================================================================
  CONSTANT DEFINITION
=============================================================================*/
static void taskdo(area_s *cxt);

/*=============================================================================
  INIT.CLOSE
=============================================================================*/
dword __stdcall area_taskFunc(void *tcb)
{
	area_s				*cxt = (area_s*)tcb;
	mcxt				task;
	dword				sig;

	task = cxt->task;
	while(TRUE)
	{
		sig = Task_GetSignal(task);

		if(TASK_IS_STARTREQ(sig))
		{
			Task_StartACK(task);
		}
		if(TASK_IS_STOPREQ(sig))
		{
			Task_StopACK(task);
			break;
		}
		if(TASK_SIGNAL_ENABLED(sig, AREA_TASK_SIG))
		{
			TASK_CLEAR_SIGNAL(task, AREA_TASK_SIG);
			taskdo(cxt);
		}
		if(TASK_IS_COMMAND(sig))
		{
		}
	}

	return	(0);
}

/*=============================================================================
  LOG.PROCESSING
=============================================================================*/
static void taskexec(area_s *cxt);

void taskdo(area_s *cxt)
{	
	int32			siz;

	siz = LList_Size(cxt->que);
	if(siz > 0)
	{
		//DBGPRINT("[T] = %d\n", siz);
		taskexec(cxt);
	}

	siz = LList_Size(cxt->que);
	if(siz > 0)
	{
		Task_PutSignal(cxt->task, AREA_TASK_SIG);
	}
}

void taskexec(area_s *cxt)
{
	Vmanual			*vm = (Vmanual*)ObjList_Get(VIEW_VMANUAL);
	SYSmgr			*sm = (SYSmgr*)ObjList_Get(SYS_MGR);
	SYSmgr_cfg_s		*cfg = sm->CFG_Ptr();
	area_cfg_s		*ac = &cfg->area_cfg;
	HFgDev			*fg = sm->m_pFg;
	char				*str;
	char				path[256];
	area_acq_s		*q = NULL;
	Time_s			tm;
	GImgVw			*gi;

	if(vm == NULL)
		return;

	gi = (GImgVw*)vm->IMG_GET();
	
	Time_GetLocalTime(ac->mea_time, &tm);
	sprintf(path, "%s\\%002d%002d%002d_%002d%002d%002d", ac->img_path, tm.nYear%100, tm.nMonth, tm.nDay, tm.nHour, tm.nMin, tm.nSec);
	FileOp_CreateDirectory(path);
	
LLIST_ENTER(cxt->que);
	if(LList_RemoveHead(cxt->que, (void**)&q) == FALSE)
	{
		return;
	}
LLIST_LEAVE(cxt->que);

		str = UIstring(NULL);

		DBGPRINT("acqID[%d] - meaCNT[%.0f]\n", q->acqID, ac->meaCNT);
		if(q->acqID == (ac->meaCNT-1))
		{
			fg->GrabStop();
		}

		sprintf(str, "%s\\%0003d.bmp", path, q->acqID);
		//---IMAGE.COPY
		switch(imtype(q->o))
		{
		case IMG_TYPE_BIT24_3CHAN:
		{
			Img2D		c0, c1, c2;
			Img2D		cc0;

			if(im3chan(q->o, &c0, &c1, &c2) == TRUE)
			{
				cc0 = imrotate(c0, 180.0, FALSE, "bicubic");

				if(imwrite(cc0, str, "bmp") == FALSE)
				{
					LOGERR("Fail to save the image !!");
				}
				
				if(gi)
				{
					gi->SetImage(cc0);
					gi->FLUSH();
				}
				IMP_FREE(c0);
				IMP_FREE(c1);
				IMP_FREE(c2);
				IMP_FREE(cc0);
			}
			else
			{
				area_ACQfree(q);
				return;
			}
			break;
		}
		case IMG_TYPE_BIT8:
		{
			if(imwrite(q->o, str, "bmp") == FALSE)
			{
				LOGERR("Fail to save the image !!");
			}
			
			if(gi)
			{
				gi->SetImage(q->o);
				gi->FLUSH();
			}
			break;
		}
		default:
			return;
		}
		area_ACQfree(q);
}

/*--- END OF area_ptask.cpp ---*/
